package DA;

import BE.*;
import java.sql.*;
import java.util.*;
import javax.swing.JOptionPane;

public class DAProducto
{
    //MANTENIMIENTO
    public ResultSet buscarProd(BEProducto producto,int tipoBusqueda)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT p.IDPRODUCTO, p.NOMBRE, t.TIPO, p.CANTIDAD,"
                           + " c.NOMBEMPRESA, p.DESCRIPCION, p.ESTADO"
                     + " FROM PRODUCTO p, TIPOPRODUCTO t, CONTACTO c, PRODUCTOXCONTACTO x"
                     + " WHERE p.NOMBRE LIKE '%" + producto.getNombre() + "%' AND"
                            + " p.IDTIPOPRODUCTO = t.IDTIPOPRODUCTO AND"
                            + " c.IDCONTACTO = x.IDCONTACTO AND x.IDPRODUCTO = p.IDPRODUCTO AND c.TIPOCONTACTO = 2";

        if (producto.getEstado() != 2)
            query += " AND p.ESTADO = '" + producto.getEstado() + "'";
        if (producto.getIdTipoProducto() > 0)
            query += " AND p.IDTIPOPRODUCTO = " + producto.getIdTipoProducto();
        if (producto.getIdProveedor() > 0)
            query += " AND c.IDCONTACTO = " + producto.getIdProveedor();

        if (tipoBusqueda == 0 ) //Busqueda completa
            query = "SELECT p.IDPRODUCTO, p.NOMBRE, t.TIPO, p.CANTIDAD, c.NOMBEMPRESA,"
                         + "p.DESCRIPCION, p.ESTADO"
                  + " FROM PRODUCTO p, TIPOPRODUCTO t, CONTACTO c, PRODUCTOXCONTACTO x"
                  + " WHERE p.IDTIPOPRODUCTO = t.IDTIPOPRODUCTO AND"
                        + " c.IDCONTACTO = x.IDCONTACTO AND x.IDPRODUCTO = p.IDPRODUCTO";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }
        bd.cierraConexion(con);
        return rs;
    }

    //AGREGAR PRODUCTO
    public List<BETipoPaleta> obtenerTipoPallets ()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        List<BETipoPaleta> tipos = null;
        BETipoPaleta tipo = null;
        String query = "SELECT * FROM TIPOPALETA";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            tipos = new ArrayList<BETipoPaleta>();
            while (rs.next())
            {
                tipo = new BETipoPaleta();
                tipo.setIdTipoPaleta(rs.getInt("IDTIPOPALETA"));
                tipo.setNombre(rs.getString("NOMBRE"));

                tipos.add(tipo);
            }
        }
        catch (Exception e)
        {
            bd.cierraConexion(con);
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            return null;
        }

        bd.cierraConexion(con);
        return tipos;
    }
    
    public int agregarProductoCargaMasiva (BEProducto producto, List<BEProductoxTipoPallet> lista)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        PreparedStatement s = null;

        String query = "";
        String query1 = "INSERT INTO PRODUCTO (IDPRODUCTO,IDTIPOPRODUCTO,NOMBRE,CANTIDAD," +
                       "DESCRIPCION,ESTADO, STOCKMINIMO, FACTOR) VALUES ("+ producto.getIdProducto() + "," +
                        producto.getIdTipoProducto() + ",'" + producto.getNombre() + "'," +
                        producto.getCantidad() + ",'" + producto.getDescripcion() + "','1',"
                      + producto.getStockMin() +","+ producto.getFactorVencimiento() +");\n";
        String query2 = "INSERT INTO PRODUCTOXCONTACTO VALUES("+ producto.getIdProducto()  + "," +
                        producto.getIdProveedor() + ");\n";
        String query3 = "";
        for (int i=0;i<lista.size();i++)
           {
               query3 += "INSERT INTO PRODUCTOXTIPOPALETA VALUES " +
                         "(" + producto.getIdProducto() +"," +
                          lista.get(i).getIdTipoPallet() + "," +
                          lista.get(i).getCantidad() + ");\n";
           }

        query += query1 + query2 + query3;
        
        try
        {
            con = bd.conectar();
            s = con.prepareStatement(query);
            s.executeUpdate();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de insertar datos"+e,
                        "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }
        bd.cierraConexion(con);
        return 0;
    }

    public int agregarProducto (BEProducto producto, List<BEProductoxTipoPallet> lista)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        PreparedStatement s = null;

        String query = "";
        String query1 = "INSERT INTO PRODUCTO (IDTIPOPRODUCTO,NOMBRE,CANTIDAD," +
                       "DESCRIPCION,ESTADO, STOCKMINIMO, FACTOR) VALUES ("+
                        producto.getIdTipoProducto() + ",'" + producto.getNombre() + "'," +
                        producto.getCantidad() + ",'" + producto.getDescripcion() + "','1',"
                      + producto.getStockMin() +","+ producto.getFactorVencimiento() +");\n";
        String query2 = "INSERT INTO PRODUCTOXCONTACTO VALUES((SELECT MAX (IDPRODUCTO) FROM PRODUCTO)," +
                        producto.getIdProveedor() + ");\n";
        String query3 = "";
        for (int i=0;i<lista.size();i++)
           {
               query3 += "INSERT INTO PRODUCTOXTIPOPALETA VALUES " +
                         "((SELECT MAX(IDPRODUCTO) FROM PRODUCTO)," +
                          lista.get(i).getIdTipoPallet() + "," +
                          lista.get(i).getCantidad() + ");\n";
           }

        query += query1 + query2 + query3;

        try
        {
            con = bd.conectar();
            s = con.prepareStatement(query);
            s.executeUpdate();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de insertar datos",
                        "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }
        bd.cierraConexion(con);
        return 0;
    }

    public boolean existeNombre (String nombre)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT COUNT(IDPRODUCTO) AS CANTIDAD "
                     + "FROM PRODUCTO WHERE NOMBRE = '" + nombre + "'";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            if (rs.getInt("CANTIDAD") > 0)
                return true;
        } catch (Exception e) {
            bd.cierraConexion(con);
            return false;
        }

        bd.cierraConexion(con);
        return false;
    }

    //ELIMINAR
    public int eliminarProd (int idProd)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        String query = "UPDATE PRODUCTO SET ESTADO = '0' WHERE IDPRODUCTO = " + idProd;

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de borrar datos","Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }

        bd.cierraConexion(con);
        return 0;
    }

    //MODIFICAR
    public BEProducto getProdbyId (int idIProd)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        BEProducto producto = null;
        String query = "SELECT p.IDPRODUCTO, p.IDTIPOPRODUCTO, p.NOMBRE, p.CANTIDAD,"
                           + " p.DESCRIPCION, p.ESTADO, p.STOCKMINIMO, p.FACTOR, c.IDCONTACTO"
                     + " FROM PRODUCTO p, CONTACTO c, PRODUCTOXCONTACTO x"
                     + " WHERE p.IDPRODUCTO = x.IDPRODUCTO AND x.IDCONTACTO = c.IDCONTACTO"
                     + " AND p.IDPRODUCTO = " + idIProd;
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            producto = new BEProducto();
            producto.setIdProducto(rs.getInt("IDPRODUCTO"));
            producto.setIdTipoProducto(rs.getInt("IDTIPOPRODUCTO"));
            producto.setNombre(rs.getString("NOMBRE"));
            producto.setCantidad(rs.getInt("CANTIDAD"));
            producto.setDescripcion(rs.getString("DESCRIPCION"));
            producto.setEstado(rs.getInt("ESTADO"));
            producto.setIdProveedor(rs.getInt("IDCONTACTO"));
            producto.setStockMin(rs.getInt("STOCKMINIMO"));
            producto.setFactorVencimiento(rs.getDouble("FACTOR"));
        }
        catch (Exception e)
        {
          JOptionPane.showMessageDialog(null,"Error al obtener productos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return producto;
    }

    public List<BEProductoxTipoPallet> getPxTbyIdProd (int idProd)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        List<BEProductoxTipoPallet> tipos = new ArrayList<BEProductoxTipoPallet>();
        BEProductoxTipoPallet tipo = null;

        String query = "SELECT * FROM PRODUCTOXTIPOPALETA WHERE IDPRODUCTO = " + idProd;
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            while(rs.next())
            {
                tipo = new BEProductoxTipoPallet();
                tipo.setIdProducto(idProd);
                tipo.setCantidad(rs.getInt("CANTIDAD"));
                tipo.setIdTipoPallet(rs.getInt("IDTIPOPALLET"));

                tipos.add(tipo);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return tipos;
    }

    public void actualizarStock (int prod, int cantidad)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        String query = "UPDATE PRODUCTO SET CANTIDAD =CANTIDAD + " + cantidad +
                       " WHERE IDPRODUCTO = " + prod;

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            
        }

        bd.cierraConexion(con);
       
    }


      public int modificaProducto (BEProducto prod)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        String query = "UPDATE PRODUCTO SET NOMBRE = '" + prod.getNombre() +
                       "', DESCRIPCION = '" + prod.getDescripcion() + "',"
                     + " STOCKMINIMO = " + prod.getStockMin() +", FACTOR = "+ prod.getFactorVencimiento() +" WHERE " +
                       "IDPRODUCTO = " + prod.getIdProducto();

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }

        bd.cierraConexion(con);
        return 0;
    }
      
      public int getTipoProdbyId (int idProd)
      {
            DAConexion bd = new DAConexion();
            Connection con = null;
            ResultSet rs = null;
            Statement s = null;
            int tipoProd = -1;

            String query = "SELECT IDTIPOPRODUCTO FROM PRODUCTO WHERE IDPRODUCTO = " + idProd;
            try
            {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            while(rs.next())
            {  tipoProd = rs.getInt("IDTIPOPRODUCTO"); }
            
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                              "Error",JOptionPane.ERROR_MESSAGE);
                bd.cierraConexion(con);
                return -1;
            }

            bd.cierraConexion(con);
            return tipoProd;
      }
      
      public List<BEProducto> getProductos ()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        
        List<BEProducto> productos = new ArrayList<BEProducto>();
        BEProducto producto = null;
        String query = "SELECT * FROM PRODUCTO WHERE ESTADO = 1";
        
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            while(rs.next())
            {
                producto = new BEProducto();
                producto.setIdProducto(rs.getInt("IDPROUCTO"));
                producto.setIdTipoProducto(rs.getInt("IDTIPOPRODUCTO"));
                producto.setNombre(rs.getString("NOMBRE"));
                producto.setCantidad(rs.getInt("CANTIDAD"));
                producto.setDescripcion(rs.getString("DESCRIPCION"));
                producto.setEstado(rs.getInt("ESTADO"));
                producto.setStockMin(rs.getInt("STOCKMINIMO"));
                producto.setFactorVencimiento(rs.getDouble("FACTOR"));

                productos.add(producto);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return productos;
    }

    //##########################################

    


    public List<BEProducto> listaProductos ()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT * FROM PRODUCTO";
        List<BEProducto> tipos = new ArrayList<BEProducto>();
      BEProducto producto= new BEProducto();

         try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            while(rs.next())
            {

               producto = new BEProducto();
            producto.setIdProducto(rs.getInt("IDPRODUCTO"));
            producto.setIdTipoProducto(rs.getInt("IDTIPOPRODUCTO"));
            producto.setNombre(rs.getString("NOMBRE"));
            producto.setCantidad(rs.getInt("CANTIDAD"));
            //producto.setFechaLectura(rs.getDate("FECHAVENCIMIENTO"));
            producto.setDescripcion(rs.getString("DESCRIPCION"));

                tipos.add(producto);
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return tipos;
    }

    //ELIMNAR FUNCION
    public void insertaProdxTipoPallet(List<BEProductoxTipoPallet> lista)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        PreparedStatement s = null;
        String query = "";

        try
        {
           con = bd.conectar();
           for (int i=0;i<lista.size();i++)
           {
               query = "INSERT INTO PRODUCTOXTIPOPALLET VALUES " +
                "((SELECT MAX(IDPRODUCTO) FROM PRODUCTO),";
               query += lista.get(i).getIdTipoPallet() + "," +
                        lista.get(i).getCantidad() + ")";
               s = con.prepareStatement(query);
               s.executeUpdate();
           }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de insertar datos",
                        "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
        }

        bd.cierraConexion(con);
    }

    public Object getZonabyIDTP (int id)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT NOMBRE FROM ZONAS WHERE IDTIPOPRODUCTO = " + id;
        Object obj = null;

         try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            rs.next();
            obj = rs.getObject("NOMBRE");

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return obj;
    }

    public Object getTipobyID (int id)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT * FROM TIPOPRODUCTO WHERE IDTIPOPRODUCTO = " + id;
        Object obj = null;

         try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            rs.next();
            obj = rs.getObject("TIPO");

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return obj;
    }
    
    public int getIdProveedor (int idProd)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT IDCONTACTO FROM PRODUCTOXCONTACTO WHERE IDPRODUCTO = " + idProd;
        int idProveedor;

         try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            rs.next();
            idProveedor = rs.getInt("IDCONTACTO");

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 0;
        }

        bd.cierraConexion(con);
        return idProveedor;
    }



      public int getCantidad (int idProd)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT cantidad FROM PRODUCTO WHERE IDPRODUCTO = " + idProd;
        int cantidad;

         try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            rs.next();
            cantidad = rs.getInt("cantidad");

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 0;
        }

        bd.cierraConexion(con);
        return cantidad;
    }



    public List<BEZona> obtenerZonas ()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        List<BEZona> zonas = null;
        BEZona zona = null;
        String query = "SELECT * FROM ZONAS";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            zonas = new ArrayList<BEZona>();
            while (rs.next())
            {
                zona = new BEZona();
                zona.setIdZona(rs.getInt("IDZONAS"));
                zona.setNombre(rs.getString("NOMBRE"));

                zonas.add(zona);
            }
        }
        catch (Exception e)
        {
//            JOptionPane.showMessageDialog(null,"Error al obtener Tipos de productos",
//                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return zonas;
    }

    //ELIMINAR FUNCION!!!!!
    public List<BETipoProducto> obtenerTipoProd ()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        List<BETipoProducto> tipos = null;
        BETipoProducto tipo = null;
        String query = "SELECT * FROM TIPOPRODUCTO";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            tipos = new ArrayList<BETipoProducto>();
            while (rs.next())
            {
                tipo = new BETipoProducto();
                tipo.setIdTipoProd(rs.getInt("IDTIPOPRODUCTO"));
                tipo.setTipo(rs.getString("TIPO"));
                tipo.setDescripcion(rs.getString("DESCRIPCION"));

                tipos.add(tipo);
            }

        }
        catch (Exception e)
        {
//            JOptionPane.showMessageDialog(null,"Error al obtener Tipos de productos",
//                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }
        
        bd.cierraConexion(con);
        return tipos;
    }
    
    public List<BEProducto> obtenerProveedores()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        List<BEProducto> proveedores = null;
        BEProducto proveedor = null;
        String query = "SELECT * FROM CONTACTO WHERE TIPOCONTACTO = 2";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            proveedores = new ArrayList<BEProducto>();
            while (rs.next())
            {
                proveedor = new BEProducto();
                proveedor.setIdProveedor(rs.getInt("IDCONTACTO"));
                proveedor.setNombre(rs.getString("NOMBEMPRESA"));

                proveedores.add(proveedor);
            }

        }
        catch (Exception e)
        {
            bd.cierraConexion(con);
            return null;
        }
        
        bd.cierraConexion(con);
        return proveedores;
    }

    public double getFactor(int idProducto)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        double factor = 0;
        String query = "SELECT FACTOR FROM PRODUCTO WHERE IDPRODUCTO = " + idProducto;

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            while (rs.next())
            {
                factor = rs.getDouble("FACTOR");
            }
        }
        catch (Exception e)
        {
            bd.cierraConexion(con);
            return -1;
        }

        bd.cierraConexion(con);
        return factor;   
    }
}
